package com.saicmotor.jobschedulerservice;

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;

import androidx.annotation.NonNull;

/**
 * @Author xinxinzhang
 * @Date 2022/08/19
 **/
public class JobSchedulerService extends JobService {

    // 任务id
    private static final int ID=10000;

    // JobService运行在主线程，所以要使用子线程、Handler或者一个异步任务来运行耗时的操作以防止阻塞主线程
    // 1.Handler
    private Handler jobHandler=new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message message) {
            // TODO：任务主体
            // ...
            // 手动调用jobFinished方法
            jobFinished((JobParameters) message.obj, false);
            return true;
        }
    });

    // 2.AsyncTask
    private JobParameters mJobParameters;
    private final AsyncTask<Void, Void, Void> mTask = new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            // TODO 耗时操作
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO 耗时操作执行完毕后，告知系统
            jobFinished(mJobParameters, true);
            super.onPostExecute(result);
        }
    };

    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        // 1.注意:使用Hanlder的时候把传进来的JobParameters保存下来
        jobHandler.sendMessage(Message.obtain(jobHandler, ID, jobParameters));

        // 2.AsyncTask
        mJobParameters = jobParameters;
        mTask.execute();

        // 返回false说明job已经完成  不是个耗时的任务
        // 返回true说明job在异步执行  需要手动调用jobFinished告诉系统job完成
        // 这里我们返回了true,因为我们要做耗时操作。
        // 返回true意味着耗时操作花费的事件比onStartJob执行的事件更长
        // 并且意味着我们会手动的调用jobFinished方法
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        jobHandler.removeMessages(ID);

        // true 需要重试
        // false 不再重试 丢弃job
        return false;
    }
}
